package abs.service;

import abs.factory.ResultFactory;
import abs.mapper.FileHistoryMapper;
import abs.utils.GlobalConfig;
import abs.utils.RankMethods;
import abs.utils.XunFeiApi;
import abs.vo.FileHistory;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.PutObjectRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.File;
import java.util.*;

@Service
public class TranslateService {
    @Autowired
    FileHistoryMapper fileHistoryMapper;

    /**
     * 通过讯飞Api提取音频中的文字
     * @param file
     * @return
     */
    public String audioToWords(File file) {
        return XunFeiApi.audioToWords(file);
    }

    /**
     * 通过讯飞Api提取图片中的文字
     * @param file
     * @return
     */
    public String picToWords(File file) {
        return XunFeiApi.picToWords(file);
    }

    /**
     * textRank算法
     * @param originText
     * @return
     */
    public Map<String, List<String>> textRank(String originText) {
        Map<String, List<String>> result = RankMethods.textRank(originText);
        if (null == result) {
            return null;
        }
        return result;
    }

    /**
     * MMR算法
     * @param originText
     * @return
     */
    public List<String> mmr(String originText) {
        List<String> result = RankMethods.mmr(originText);
        if (null == result) {
            return null;
        }
        return result;
    }

    /**
     * word2vec算法
     * @param originText
     * @return
     */
    public List<String> word2vec(String originText) {
        List<String> result = RankMethods.word2vec(originText);
        if (null == result) {
            return null;
        }
        return result;
    }

    /**
     * 把文件存入阿里云oss,并将文件路径存入数据库历史记录中
     * @param file
     */
    public FileHistory saveFileOnOss(File file, String userName, String fileType, String originalFileName ) {
        // Endpoint以杭州为例，其它Region请按实际情况填写。(这里用的上海)
        String endpoint = GlobalConfig.getEndpoint();
        // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建RAM账号。
        String accessKeyId = GlobalConfig.getAccessKeyId();
        String accessKeySecret = GlobalConfig.getAccessKeySecret();
        String bucket = GlobalConfig.getBucket(); //bucket
        String fileName = handleFileName(originalFileName);
        String object = GlobalConfig.getContents()+fileName; // 目录/文件名

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 创建PutObjectRequest对象。
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, object, file);

        // 上传文件。
        ossClient.putObject(putObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();

        //生成新的历史记录并存入数据库
        FileHistory fileHistory = new FileHistory();
        fileHistory.setId(UUID.randomUUID().toString().replace("-",""));
        fileHistory.setUserName(userName);
        fileHistory.setFileName(originalFileName);
        fileHistory.setUploadTime(new Date());
        fileHistory.setFilePath(object);
        fileHistory.setFileType(fileType);
        fileHistoryMapper.insertHistory(fileHistory);

        return fileHistory;
    }

    /**
     * 把oss上的文件下载下来
     * @param objectName
     * @return
     */
    private String downloadFileFromOss(String objectName) {
        // Endpoint以杭州为例，其它Region请按实际情况填写。(这里用的上海)
        String endpoint = GlobalConfig.getEndpoint();
        // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建RAM账号。
        String accessKeyId = GlobalConfig.getAccessKeyId();
        String accessKeySecret = GlobalConfig.getAccessKeySecret();
        String bucketName = GlobalConfig.getBucket(); //bucket
        String tempPath = GlobalConfig.getTempFilePath();//临时文件路径
        String tempFilePath = tempPath+objectName.split("/")[1];

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 下载Object到本地文件，并保存到指定的本地路径中。如果指定的本地文件存在会覆盖，不存在则新建。
        // 如果未指定本地路径，则下载后的文件默认保存到示例程序所属项目对应本地路径中。
        ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(tempFilePath));

        // 关闭OSSClient。
        ossClient.shutdown();

        return tempFilePath;
    }

    /**
     * 获取历史记录的文件，并摘要该文件
     * @param userName
     * @param filePath
     * @param fileType
     */
    public Map<String, Object> getFileAndAbstract(String userName, String filePath, String fileType, String fileName) {
        Map<String, Object> resultMap = new HashMap<>();
        String result = "";
        String localFilePath = downloadFileFromOss(filePath);//从阿里云oss服务器上获取文件
        if (!"null".equals(userName)) {
            //生成新的历史记录对象
            FileHistory fileHistory = new FileHistory();
            fileHistory.setUserName(userName);
            fileHistory.setId(UUID.randomUUID().toString().replace("-",""));
            fileHistory.setFileType(fileType);
            fileHistory.setFilePath(filePath);
            fileHistory.setFileName(fileName);
            fileHistory.setUploadTime(new Date());
            fileHistoryMapper.insertHistory(fileHistory);
            resultMap.put("fileHistory", fileHistory);
        }
        //摘要获取到的文件
        if ("audio".equals(fileType)) {
            result = audioToWords(new File(localFilePath));
            if (result.contains("onebest")) {
                resultMap.put("result", result);
                return resultMap;
            } else {
                return null;
            }
        }
        if ("pic".equals(fileType)) {
            result = picToWords(new File(localFilePath));
            System.out.println(result);
            if (null != result) {
                resultMap.put("result", result);
                return resultMap;
            } else {
                return null;
            }
        }
        return null;
    }

    /**
     * 根据用户名获取用户的所有历史记录
     * @param userName
     * @return
     */
    public List<FileHistory> getHistoryByUserName (String userName) {
        List<FileHistory> resultList = fileHistoryMapper.getHistoryByUserName(userName);
        return resultList;
    }

    /**
     * 在文件名上加上时间戳，防止文件名重复导致文件覆盖
     * @param fileName
     * @return
     */
    private String handleFileName(String fileName) {
        String nameArr[] = fileName.split("\\.");
        Long time = System.currentTimeMillis();
        String result = nameArr[0] + time + "." +nameArr[1];
        return result;
    }
}
